#include <stdio.h> 
#include <stdlib.h>
#include <string.h>

/*
指针偏移
不会改变指针的指向===》指针没有被赋值
指针本身不变，往旁边读

加或者减是 一个单位
*/

int main()
{
	int a=9;
    int b=a+1;

    int num=0X12AB34CD;
    //0001 0010 1010 1011 0011 0100 1100 1101   原码==补码
    //地址与二进制倒叙对应
    //000000000022FE34   1100 1101
    //000000000022FE35   0011 0100
    //000000000022FE36   1010 1011
    //000000000022FE37   0001 0010

    /*
    大端序（Big-Endian）将数据的低位字节存放在内存的高位地址，
    高位字节存放在低位地址。 这种排列方式与数据用字节表示时的书写顺序一致，
    符合人类的阅读习惯。

    小端序（Little-Endian），将一个多位数的低位放在较小的地址处，
    高位放在较大的地址处，则称 小端序 。 小端序与人类的阅读习惯相反，
    但更符合计算机读取内存的方式，因为CPU读取内存中的数据时，
    是从低地址向高地址方向进行读取的。

    对于小于四个字节的类型再遇到 %d%u 或者进行算术运算时，就会发生整形提升：
    此时整形提升的规则是把一个字节的内容取出来如果是signed类型补符号位，unsined类型补0

    */

    int* p=&num;

    printf("%d %0X %p\n",num,num,&num);

    printf("%p %0X\n",p,p);


    char* pch=(char*)p;

    //char 类型1个字节,8个bit位
    //扩充字节，根据最高位数值，进行扩充，
    //1100 1101 根据最高位扩充为下一行
    //1111 1111 1111 1111 1111 1111 1100 1101   补码,机器里面存放的都是补码
    //1000 0000 0000 0000 0000 0000 0011 0010
    //1000 0000 0000 0000 0000 0000 0011 0011   原码-51
    printf("%d %p %0X %p\n",*pch,*pch,*pch,pch);


    //0011 0100 根据最高位扩充为下一行
    //0000 0000 0000 0000 0000 0000 0011 0100     补码,机器里面存放的都是补码
    printf("%d %p %0X %p\n",*(pch+1),*(pch+1),*(pch+1),pch+1); 

    //1010 1011 根据最高位扩充为下一行
    //1111 1111 1111 1111 1111 1111 1010 1011   补码,机器里面存放的都是补码
    //1000 0000 0000 0000 0000 0000 0101 0100
    //1000 0000 0000 0000 0000 0000 0101 0101   原码-85
    printf("%d %p %0X %p\n",*(pch+2),*(pch+2),*(pch+2),pch+2); 

    //0001 0010 根据最高位扩充为下一行
    //0000 0000 0000 0000 0000 0000 0001 0010     补码,机器里面存放的都是补码
    printf("%d %p %0X %p\n",*(pch+3),*(pch+3),*(pch+3),pch+3); 

    

    char 	*c;
	printf("char = %d %d\n",sizeof(char),sizeof(c));
	printf("0x%p\n",c);
	printf("0x%p\n\n",c+1);
	
	short 	*s;
	printf("short = %d %d\n",sizeof(short),sizeof(s));
	printf("0x%p\n",s);
	printf("0x%p\n\n",s+1);
	
	int  	*i;
	printf("int = %d %d\n",sizeof(int),sizeof(i));
	printf("0x%p\n",i);
	printf("0x%p\n\n",i+1);	
	
	float   *f;
	printf("float = %d %d\n",sizeof(float),sizeof(f));
	printf("0x%p\n",f);
	printf("0x%p\n\n",f+1);	
	
	double   *d;
	printf("double = %d %d\n",sizeof(double),sizeof(d));
    printf("0x%p\n",d);
	printf("0x%p\n\n",d+1);	




	//system("pause");
	return 0;
} 